"""
函数参数种类
- 位置参数
- 关键字参数
- 缺省参数
- 不定长参数
"""


def name_txt(name, age, gender):
    print(f"姓名：{name}，年龄：{age}，性别：{gender}")


# 位置参数：调用函数时根据函数定义的参数位置来传递参数
# 传递的参数和定义的参数的顺序及个数必须一致
name_txt("小明", 18, "男")


# 关键字参数：函数调用时通过“键=值”形式传递参数
# 可以让函数更加清晰、容易使用，同时也清除了参数的顺序需求
# 如果有位置参数时，位置参数必须在关键字参数的前面，但关键字参数之间不存在先后顺序
name_txt(name="小明", age=18, gender="男")
name_txt("小明", gender="男", age=18)
name_txt(age=12, name="小红", gender="女")
name_txt(age=22, gender="女", name="小紫")
name_txt(gender="男", age=30, name="小蓝")


# 不定长参数：不定长参数也叫可变参数. 用于不确定调用的时候会传递多少个参数(不传参也可以)的场景
def name_txt(*args):
    print(f"其类型为{type(args)},里面的元素为{args}")


# 传进的所有参数都会被args变量收集，它会根据传进参数的位置合并为一个元组(tuple)，args是元组类型，这就是位置传递
name_txt("小明", 18, 2222, "香蕉")


# 不定长参数——关键字传递
def name_txt(**kwargs):
    print(f"其类型为{type(kwargs)},里面的元素为{kwargs}")


# 参数是“键=值”形式的形式的情况下, 所有的“键=值”都会被kwargs接受, 同时会根据“键=值”组成字典
name_txt(name="小红", age=19, gender="女")


# 缺省参数：缺省参数也叫默认参数，用于定义函数，为参数提供默认值，调用函数时可不传该默认参数的值
# （注意：所有位置参数必须出现在默认参数前，包括函数定义和调用）
def name_txt(name, age=18, gender="男"):
    print(f"姓名：{name} ，年龄：{age} ，性别：{gender}")


# 函数调用时，如果为缺省参数传值则修改默认参数值, 否则使用这个默认值
name_txt("小明", age=18)
name_txt("小明", gender="女")
name_txt("小红", gender="女", age=19)
